/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package snmpmanager.src;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 *
 * @author jquinterob
 */
public class SNMPManager {
    private String mensaje;
    private String cachePrivilegios; //variable en la que se almacenan los privilegios del usuario logueado
    DatagramSocket dgSocket;
    DatagramPacket datagram;
    final static int PORT = 5161;// puerto asignado para la comunicación con el servidor
    InetAddress destino;
    byte msg[] = new byte[42];
    byte res[] = new byte[42];
    private String recibido;
    private SNMPTrama  objTrama;

    public SNMPTrama hacerConsulta(String ip, String comunidad, int opcion)throws SocketException, UnknownHostException, IOException, ClassNotFoundException{
        objTrama = new SNMPTrama();
        objTrama.setVersion('0');
        objTrama.setComunidad(comunidad);
        objTrama.setId(opcion);
        if(opcion != 13612418)
            objTrama.setOperacion(16);
        else
            objTrama.setOperacion(32);
        msg = crearTramaSNMP(objTrama);
        ejecutarCliente(ip);
        empaquetarMensaje();
        enviarMensaje();
        recibirRespuesta(msg);
        leerTramaSNMP(res, objTrama);
        return objTrama;
    }


    public void ejecutarCliente(String ip) throws SocketException, UnknownHostException{
        dgSocket = new DatagramSocket();
        destino = InetAddress.getByName(ip);
    }
   public byte[] empaquetarMensaje(){
        datagram = new DatagramPacket(msg, msg.length, destino, PORT);
        return null;
    }
    public void enviarMensaje() throws IOException{
        dgSocket.send(datagram);
    }
    public void recibirRespuesta(byte[] msg) throws IOException{
        datagram = new DatagramPacket(msg, msg.length);
        dgSocket.receive(datagram);
        res= new byte[42];
        res = datagram.getData();
    }
    private void leerTramaSNMP(byte[] trama,SNMPTrama objTrama) {
        byte section[]=new byte[1];
        int j=0;
        int k=0;
        for(int i = 0;i<trama.length;i++){
               char tmp =(char)(trama[i]);
               if(tmp != '&'){
                    section[k]=trama[i];
                    if(k<section.length-1)
                        k++;
               }else{
                   j++;
                   if(j==1){
                       char tmp2 =(char)(section[k]);
                       objTrama.setVersion(tmp2);
                       section = new byte[7];
                   }
                   if(j==2){
                       objTrama.setComunidad((new String(section).trim()));
                       section = new byte[1];
                   }
                   if(j==3){
                       objTrama.setOperacion((int)section[k]);
                       section = new byte[8];
                   }
                   if(j==4){
                       objTrama.setId(toInt(section));
                       section = new byte[20];
                   }
                   if(j==5){
                       objTrama.setDato(new String(section));
                   }
                   k=0;
               }
        }
    }
    public int toInt( byte[] bytes ) {
        int result = 0;
        int multi= 10000000;
        for (int i=0; i<bytes.length; i++) {
          result = result + ((int)(bytes[i])*multi);
          multi = multi/10;
        }
        return result;
     }
    private byte[] crearTramaSNMP(SNMPTrama objTrama) {
        byte res2[]=new byte[42];
        int largoDato;
        int largoComunidad = objTrama.getComunidad().length();
        if(objTrama.getDato()!= null){
            largoDato = objTrama.getDato().length();
        }
        else{
            largoDato = 0;
        }
            res2[0]= (byte) objTrama.getVersion();
            res2[1]='&';
            for(int i=0;i<largoComunidad;i++){
                res2[2+i] = (byte) objTrama.getComunidad().charAt(i);
            }
            res2[largoComunidad+2]='&';
            res2[largoComunidad+3]= (byte) objTrama.getOperacion();
            res2[largoComunidad+4]='&';
            res2[largoComunidad+5]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(0));
            res2[largoComunidad+6]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(1));
            res2[largoComunidad+7]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(2));
            res2[largoComunidad+8]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(3));
            res2[largoComunidad+9]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(4));
            res2[largoComunidad+10]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(5));
            res2[largoComunidad+11]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(6));
            res2[largoComunidad+12]=(byte) Character.getNumericValue(Integer.toString(objTrama.getId()).charAt(7));
            res2[largoComunidad+13]='&';
            for(int i=0;i<20;i++){
                if(i<largoDato){
                    res2[largoComunidad+14+i] = (byte) objTrama.getDato().charAt(i);
                }
                else{
                    res2[largoComunidad+14+i] = (byte)' ';
                }
            }
            res2[largoComunidad+34]='&';
            return res2;
    }
}
